//################################################################################
// MIT License
// Copyright (c) 2024 ZhangYihua
//
// Change Logs:
// Date           Author       Notes
// 2020-06-24     ZhangYihua   first version
//
// Description  : 
//################################################################################

// history high-level latch and write 1 clear register
module hhl_wc_reg #(
parameter           DW                      = 1
) ( 
input                                       rst_n,
input                                       clk,

input                                       cs,
input                                       we,
input               [DW-1:0]                wd,

input               [DW-1:0]                d,      // realtime value
output  reg         [DW-1:0]                q       // history high-level latch value
);

//################################################################################
// define local varialbe and localparam
//################################################################################
wire                [DW-1:0]                clr;
wire                [DW-1:0]                q_c;

//################################################################################
// main
//################################################################################

assign clr = ((cs==1'b1) && (we==1'b1)) ? wd : {DW{1'b0}};
assign q_c = (q & (~clr)) | d;

always@(posedge clk or negedge rst_n) begin
    if (rst_n==1'b0) begin
        q <=`U_DLY {DW{1'b0}};
    end else begin
        q <=`U_DLY q_c;
    end
end

//################################################################################
// ASSERTION
//################################################################################

`ifdef CBB_ASSERT_ON
// synopsys translate_off


// synopsys translate_on
`endif

endmodule
